package com.laolang.pluto.common.util;

import cn.hutool.core.util.StrUtil;
import lombok.experimental.UtilityClass;
import org.slf4j.Logger;

/**
 * 通用日志工具类
 *
 * @author laolang
 * @date 2021-07-2021/7/31 15:29
 */
@UtilityClass
public class LogUtil {

    private static final int DEFAULT_ORIGIN_STACK_INDEX = 2;

    /**
     * 方法 行号 消息内容
     */
    private static final String FORMAT = "[Business Log] [{}] [{}] ===> {}";

    /**
     * 获取当前文件名称
     */
    public static String getFileName() {
        return Thread.currentThread().getStackTrace()[DEFAULT_ORIGIN_STACK_INDEX].getFileName();
    }

    /**
     * 获取当前类名称
     */
    public static String getClassName() {
        return Thread.currentThread().getStackTrace()[DEFAULT_ORIGIN_STACK_INDEX].getClassName();
    }

    /**
     * 获取当前方法名称
     */
    public static String getMethodName() {
        return Thread.currentThread().getStackTrace()[DEFAULT_ORIGIN_STACK_INDEX].getMethodName();
    }

    /**
     * 获取当前代码行号
     */
    public static int getLineNumber() {
        return Thread.currentThread().getStackTrace()[DEFAULT_ORIGIN_STACK_INDEX].getLineNumber();
    }

    /**
     * info 信息
     *
     * @param logger  logger
     * @param message 日志内容
     */
    public static void info(Logger logger, String message) {
        StackTraceElement ste = getStackTraceElement(DEFAULT_ORIGIN_STACK_INDEX);
        logger.info(getMessage(ste, message));
    }


    /**
     * error 信息
     *
     * @param logger  logger
     * @param message 日志内容
     */
    public static void error(Logger logger, String message) {
        StackTraceElement ste = getStackTraceElement(DEFAULT_ORIGIN_STACK_INDEX);
        logger.error(getMessage(ste, message));
    }

    /**
     * error 信息
     *
     * @param logger  logger
     * @param message 日志内容
     */
    public static void error(Logger logger, String message, Integer originStackIndex) {
        StackTraceElement ste = getStackTraceElement(originStackIndex);
        logger.error(getMessage(ste, message));
    }

    /**
     * warn 信息
     *
     * @param logger  logger
     * @param message 日志内容
     */
    public static void warn(Logger logger, String message) {
        StackTraceElement ste = getStackTraceElement(DEFAULT_ORIGIN_STACK_INDEX);
        logger.warn(getMessage(ste, message));
    }

    private static String getMessage(StackTraceElement ste, String message) {
        return StrUtil.format(FORMAT, ste.getMethodName(), ste.getLineNumber(), message);
    }

    private static StackTraceElement getStackTraceElement(Integer originStackIndex) {
        java.lang.StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        int index = 0 > originStackIndex || originStackIndex >= stackTrace.length ? DEFAULT_ORIGIN_STACK_INDEX :
                originStackIndex;
        return stackTrace[index];
    }


}
